์ž‘์„ฑ: 2026-03-04 05:39:06์ˆ˜์ •: 2026-03-04 05:39:06

TypeScript ๊ธฐ์ดˆ: ์™œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Œ€์‹  ํƒ€์ž…์„ ์จ์•ผ ํ• ๊นŒ?

ํ˜„๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์—์„œ **TypeScript(ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ)**๋Š” ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜ ๊ธฐ์ˆ ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์œ ์—ฐํ•จ์€ ์œ ์ง€ํ•˜๋ฉด์„œ, 'ํƒ€์ž…'์ด๋ผ๋Š” ์•ˆ์ „์žฅ์น˜๋ฅผ ๋”ํ•ด ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ฃผ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํ•ต์‹ฌ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


1. TypeScript๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ **์ƒ์œ„ ์ง‘ํ•ฉ(Superset)**์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์ด๊ธฐ๋„ ํ•˜์ง€๋งŒ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์—†๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์ •์  ํƒ€์ž… ์‹œ์Šคํ…œ: ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „(์ปดํŒŒ์ผ ํƒ€์ž„)์— ์—๋Ÿฌ๋ฅผ ์žก์•„๋ƒ…๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ ๊ณผ์ •: ๋ธŒ๋ผ์šฐ์ €๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง์ ‘ ์ฝ์ง€ ๋ชปํ•˜๋ฏ€๋กœ, tsc ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2. ์ฃผ์š” ๋ฌธ๋ฒ• ๊ธฐ์ดˆ

โ‘  ๊ธฐ๋ณธ ํƒ€์ž… ์ง€์ •

๋ณ€์ˆ˜๋ช… ๋’ค์— :์„ ๋ถ™์—ฌ ํƒ€์ž…์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

let name: string = "ํ™๊ธธ๋™";
let age: number = 25;
let isStudent: boolean = true;
let scores: number[] = [90, 85, 100];

โ‘ก ์ธํ„ฐํŽ˜์ด์Šค (Interface)

๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ˜‘์—… ์‹œ ๋ฐ์ดํ„ฐ ๊ทœ๊ฒฉ์„ ๋งž์ถ”๋Š” ๋ฐ ๋งค์šฐ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.

interface User {
    id: number;
    userName: string;
    email?: string; // ?๋Š” ์„ ํƒ์  ํ•„๋“œ (Optional)
}
 
const user: User = {
    id: 1,
    userName: "Alice"
};

โ‘ข ์ œ๋„ค๋ฆญ (Generics)

ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋ฅผ ๋‹ค์–‘ํ•œ ํƒ€์ž…์— ๋Œ€ํ•ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

function getFirstElement<T>(arr: T[]): T {
    return arr[0];
}
 
const firstNum = getFirstElement([1, 2, 3]); // number๋กœ ์ถ”๋ก 
const firstStr = getFirstElement(["a", "b"]); // string์œผ๋กœ ์ถ”๋ก 

3. interface vs type: ๋ฌด์—‡์„ ์จ์•ผ ํ• ๊นŒ?

๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ ์šฉ๋„์™€ ๊ธฐ๋Šฅ์— ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

โ‘  interface (์ธํ„ฐํŽ˜์ด์Šค)

  • ์šฉ๋„: ์ฃผ๋กœ ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํŠน์ง• (์„ ์–ธ์  ํ™•์žฅ): ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์„ ์–ธํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ฉ์ณ์ง‘๋‹ˆ๋‹ค(Declaration Merging). ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํƒ€์ž…์„ ํ™•์žฅํ•  ๋•Œ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ์†: extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง๊ด€์ ์œผ๋กœ ์ƒ์† ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

โ‘ก type (ํƒ€์ž… ๋ณ„์นญ)

  • ์šฉ๋„: ๊ฐ์ฒด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์›์‹œ๊ฐ’, ์—ฐ์‚ฐ์ž(|, &), ํŠœํ”Œ ๋“ฑ ๋ชจ๋“  ํƒ€์ž…์— ์ด๋ฆ„์„ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠน์ง•: ํ•œ ๋ฒˆ ์ •์˜ํ•˜๋ฉด ํ™•์žฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(์ƒˆ๋กœ ์ •์˜ํ•ด์•ผ ํ•จ).
  • ์กฐํ•ฉ: & (Intersection) ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž…์„ ํ•ฉ์นฉ๋‹ˆ๋‹ค.

4. interface ์ƒ์†(extends) ์‹ฌํ™” ์ดํ•ดํ•˜๊ธฐ

extends๋Š” ๊ธฐ์กด์— ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ๋“  ์†์„ฑ์„ ๊ทธ๋Œ€๋กœ ๋ฌผ๋ ค๋ฐ›์œผ๋ฉด์„œ ์ƒˆ๋กœ์šด ์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ํ•ต์‹ฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

โ‘  ๊ธฐ๋ณธ ์ƒ์† (Single Inheritance)

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ๋กœ, ๋ถ€๋ชจ์˜ ๋ชจ๋“  ์†์„ฑ์„ ์ž์‹์ด ๊ทธ๋Œ€๋กœ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

interface BasicUser {
  id: string;
  name: string;
}
 
interface PremiumUser extends BasicUser {
  membershipLevel: number;
  discountRate: number;
}
// PremiumUser๋Š” id, name, membershipLevel, discountRate 4๊ฐœ์˜ ์†์„ฑ์„ ๋ชจ๋‘ ๊ฐ€์ง

โ‘ก ๋‹ค์ค‘ ์ƒ์† (Multiple Inheritance)

TypeScript์˜ interface๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ถ€๋ชจ๋ฅผ ๋™์‹œ์— ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์กฐ๋ฆฝ์‹(Mix-in) ์Šคํƒ€์ผ์˜ ํƒ€์ž… ์„ค๊ณ„๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

interface Flyable { fly(): void; }
interface Swimmable { swim(): void; }
 
// ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‰ผํ‘œ(,)๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ƒ์†
interface SuperDuck extends Flyable, Swimmable {
  quack(): void;
}

โ‘ข ์†์„ฑ ์žฌ์ •์˜ (Overriding) ์ฃผ์˜์‚ฌํ•ญ

์ƒ์†๋ฐ›์€ ์†์„ฑ์˜ ํƒ€์ž…์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐ˜๋“œ์‹œ ๋ถ€๋ชจ ํƒ€์ž…๊ณผ ํ˜ธํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

interface Product {
  id: string | number;
  name: string;
}
 
// ๋ถ€๋ชจ๊ฐ€ string | number์ด๋ฏ€๋กœ, ์ž์‹์€ ๋” ๊ตฌ์ฒด์ ์ธ string์œผ๋กœ ์ขํžˆ๋Š” ๊ฒƒ๋งŒ ๊ฐ€๋Šฅ
interface DigitalProduct extends Product {
  id: string; // OK
}
 
/* ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์˜ˆ์‹œ
interface FoodProduct extends Product {
  id: boolean; // Error! 'boolean'์€ 'string | number'์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
}
*/

5. ์‹ค๋ฌด์—์„œ์˜ ํ™œ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

์‹ค์ œ ๊ฐœ๋ฐœ ์‹œ์—๋Š” ๊ณตํ†ต ์†์„ฑ์„ ๊ฐ€์ง„ ๋ฒ ์ด์Šค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์ด๋ฅผ ํ™•์žฅํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค: UI ์ปดํฌ๋„ŒํŠธ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ

์›น ํŽ˜์ด์ง€์˜ ์—ฌ๋Ÿฌ ์š”์†Œ๋“ค์ด ๊ณตํ†ต์œผ๋กœ ๊ฐ–๋Š” ์†์„ฑ(id, ์Šคํƒ€์ผ, ํด๋ฆญ ์ด๋ฒคํŠธ)์„ ๋ฒ ์ด์Šค๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

interface BaseComponent {
  id: string;
  className?: string;
  onClick: () => void;
}
 
interface ButtonProps extends BaseComponent {
  label: string;
  color: "blue" | "red";
}
 
interface InputProps extends BaseComponent {
  value: string;
  placeholder: string;
}

์ด๋ ‡๊ฒŒ ์„ค๊ณ„ํ•˜๋ฉด ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ id์™€ onClick์„ ๊ฐ€์ ธ์•ผ ํ•จ์„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์–ด ๊ด€๋ฆฌ๊ฐ€ ๋งค์šฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.


6. ์‹ค๋ฌด ์„ ํƒ ๊ฐ€์ด๋“œ (Best Practice)

...

  1. ๊ฐ์ฒด์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” interface๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”. ์„ฑ๋Šฅ์ƒ ์ด์ ์ด ์žˆ๊ณ  extends๊ฐ€ ๋” ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.
  2. Union(|)์ด๋‚˜ Intersection(&) ๊ฐ™์€ ๋ณต์žกํ•œ ํƒ€์ž… ์กฐํ•ฉ์ด ํ•„์š”ํ•  ๋•Œ๋Š” type์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  3. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ œ์ž‘์ž๋ผ๋ฉด interface๋ฅผ ์“ฐ์„ธ์š”. ์‚ฌ์šฉ์ž๊ฐ€ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ํƒ€์ž…์„ ํ™•์žฅ(Merging)ํ•˜๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

6. ์™œ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ? (์žฅ์ )

...

  1. ์—๋Ÿฌ ์˜ˆ๋ฐฉ: ํ•จ์ˆ˜์— ์ž˜๋ชป๋œ ์ธ์ž๋ฅผ ๋„˜๊ธฐ๊ฑฐ๋‚˜ ์˜คํƒ€๋ฅผ ๋‚ด๋ฉด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์ฆ‰์‹œ ๋œน๋‹ˆ๋‹ค.
  2. ์ž๋™ ์™„์„ฑ (DX): IDE๊ฐ€ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์ถ”์ฒœํ•ด์ฃผ๋ฏ€๋กœ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋งค์šฐ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.
  3. ๊ฐ€๋…์„ฑ: ์ฝ”๋“œ๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ๋ฌธ์„œ ์—ญํ• ์„ ํ•˜์—ฌ, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์“ด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

4. ๊ฒฐ๋ก 

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ๋Š” ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๊ณผ์ •์ด ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žก์•„์ฃผ๋Š” ๋ฒ„๊ทธ ํ•œ๋‘ ๊ฐœ๊ฐ€ ์ˆ˜ ์‹œ๊ฐ„์˜ ๋””๋ฒ„๊น… ์‹œ๊ฐ„์„ ์•„๊ปด์ค€๋‹ค๋Š” ๊ฒƒ์„ ์ฒด๊ฐํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋ฐ”๋กœ npx tsc --init์œผ๋กœ ์‹œ์ž‘ํ•ด ๋ณด์„ธ์š”!